package com.ygqh.baby.service;

import com.foxinmy.weixin4j.mp.message.TemplateMessage;
import com.foxinmy.weixin4j.mp.model.TemplateMessageInfo;
import com.foxinmy.weixin4j.tuple.NotifyTuple;
import com.ygqh.baby.ao.*;
import com.ygqh.baby.po.YgOrder;
import com.ygqh.baby.po.YgUser;
import com.ygqh.baby.service.wechat.message.YgSubscribeTempMsg;
import com.ygqh.baby.service.wechat.message.YgTemplateMessage;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

public interface WxMpMessageService {
	public TemplateMessage getTemplateMessageInfo(YgOrder order, YgUser user, WxMessageType mType);

	public Message sendTemplateMessage(TemplateMessage tplMessage);

	public List<TemplateMessageInfo> getTemplateMessageList();

	/**
	 * 发送返利模板消息
	 * 
	 * @param order
	 * @param user
	 *            接收消息的用户
	 * @param rebatePrice
	 * @param title
	 * @param operationType
	 * @return
	 */
	public Message sendRebateMessage(YgOrder order, YgUser user, BigDecimal rebatePrice, String title, String remark, OperationType operationType);

	Message sendCustomMsg(NotifyTuple notifyTuple, String to, String platformNo);

	public Message sendOrderPaySuccessMsg(Long userId, Long orderId, BigDecimal orderPrice, String productName, int size);

	/**
	 * 订单完成，发送消息 （同一用户多个订单只发送一条数据）
	 * 
	 * @param user
	 *            接收消息的用户
	 * @param orderList
	 *            该用户的订单
	 * @return
	 */
	public Message sendOrderSuccessMsg(YgUser user, List<YgOrder> orderList);

	public Message sendOrderSuccessMsg(YgUser user, String url, String title, String remark, String[] strings);

	public String getWxMsgTempId(WxMessageType messageType);

	/**
	 * 退换货单审核通过发送消息
	 * 
	 * @param returnCode
	 * @param returnStatus
	 * @param returnType
	 * @param userId
	 * @param remark
	 * @param orderId
	 * @return
	 */
	Message sendAudit4Return(String returnCode, ReturnStatus returnStatus, ReturnType returnType, Long userId,
									String remark, Long orderId);

	/**
	 * 邀请的好友在壹果商城买了新商品，送您20元红包
	 * 
	 * @param userId
	 * @param friendNickName
	 * @return
	 */
	Message sendRedPacketMessage(Long userId, String friendNickName);

	/**
	 * 换货订单商品发货通知
	 * 
	 * @param expressCompany
	 * @param expressCode
	 * @param productNames
	 *            (格式：发货商品的第一件商品名称 +等 【此次发货种类】件)
	 * @param orderId
	 * @return
	 */
	Message sendGoods4Change(String expressCompany, String expressCode, String productNames, Long orderId, Long userId);

	Message sendWaitingPay$Samll(YgOrder order, String samllOpenId);

	/**
	 * 小程序发送模板消息
	 * 
	 * @param tplMessage
	 * @return
	 */
	public Message sendTmplMsg$Small(YgTemplateMessage tplMessage);

	/**
	 * 发送代理审核消息
	 * 
	 * @param userName
	 * @param openId
	 * @param checkStatus
	 * @param reason
	 * @return
	 */
	Message sendAgentAuditMsg(String userName, String openId, CheckStatus checkStatus, String reason);

	/**
	 * 发送邀请注册成功消息，只针对于代理用户的邀请（userAgent）
	 * 
	 * {{first.DATA}} 昵称：{{keyword1.DATA}} 账户：{{keyword2.DATA}}
	 * 注册时间：{{keyword3.DATA}} {{remark.DATA}}
	 * 
	 * @return
	 */
	Message sendInviteRegisterSuccessMsg(String operId, String inviterSourceCode, String registerUserName, String registerNickName);

	/**
	 * 晒单 赞/评价通知
	 * 
	 * @param title
	 * 
	 * @param nickName
	 *            评价人昵称
	 * 
	 * @param userId
	 *            接收人
	 * @param publishId
	 * @return {{first.DATA}} 评价来源：{{keyword1.DATA}} 活动时间：{{keyword2.DATA}}
	 *         {{remark.DATA}}
	 */
	Message sendNewReviewMsg(String title, String nickName, Long userId, Long publishId);

	/**
	 * 成长基金到账消息
	 * 
	 * @param title
	 * @param price
	 * @param time
	 * @param content
	 * @return
	 */
	Message sendGrowthFundMsg(String title, BigDecimal price, Date time, String content, Long userId);

	/**
	 * 发送订单支付成功消息
	 * 
	 * @Title: sendOrderPaySuccessMsg
	 * @param title
	 * @param orderId
	 * @param openId
	 * @param totalPrice
	 * @param productName
	 * @param goodsType
	 * @param url
	 *            入参
	 * @return Message 返回类型
	 * @author （guohao）
	 * @throws @date
	 *             2017年7月19日 上午10:23:47
	 * @version V1.0
	 */
	Message sendOrderPaySuccessMsg(String title, Long orderId, String openId, BigDecimal totalPrice, String productName, int goodsType, String url);

	Message sendGroupOrderRemindMsg(String title, String remainingTime, Long lastAmount, String url, Long userId);

	Message sendActionMsg(String content, String link, String userName, String openId, String keyword2, String keyword3, String keyword4, String remark);

	Message sendBindMsg(String first, String link, String keyword1, String openId, String keyword2, String remark);

	Message sendBindMsg(String first, String link, String remark, YgUser user, String... keywords);

	Message sendServiceExpressMsg(String first, String link, String keyword1, String keyword2, String openId, String keyword3, String remark);

	/**
	 * 发送一次性订阅消息
	 * 
	 * @Title: sendSubscribeMsg
	 * @param openId
	 * @param title
	 * @param templateId
	 * @param url
	 *            相对路径不含域名
	 * @param scene
	 * @param content
	 *            入参
	 * @return Message 返回类型
	 * @author （guohao）
	 * @throws @date
	 *             2017年7月25日 下午3:23:49
	 * @version V1.0
	 */
	Message sendSubscribeMsg(String openId, String title, String templateId, String url, String scene, String content);

	Message sendSubscribeMsg(YgSubscribeTempMsg subscribeTempMsg);

	/**
	 * 发送客服消息 (48小时内不限制发送次数)
	 * 
	 * @Title: sendCustomMsg
	 * @param notifyTuple
	 *            消息元件
	 * @param to
	 *            入参
	 * @return Message 返回类型
	 * @author （guohao）
	 * @throws @date
	 *             2017年8月23日 下午1:44:55
	 * @version V1.0
	 */
	@Deprecated
	Message sendCustomMsg(NotifyTuple notifyTuple, String to);

	Message sendOrderSendMsg(String title, String orderId, String expressCompany, String expressCode, String productName, String openId);

	Message sendBalanceMessage(Date time, String orderId, YgUser user, BigDecimal rebatePrice, String title, String remark, BalanceType balanceType);

	Message cancelAgentAuditMsg(String userName, String openId, String reason, String url);

	/**
	 * 发送优惠券到账提醒
	 * @param title
	 * @param link
	 * @param user
	 * @param keywords
	 * @return
	 */
	Message sendCouponMsg(String title, String link, YgUser user, String... keywords);

	/**
	 * 发送过期提醒
	 * @param ygUser
	 * @param title
	 * @param link
	 * @param remark
	 * @param keywords
	 * @return
	 */
	Message sendOverdueReminder(YgUser ygUser, String title, String link, String remark, String... keywords);

	/**
	 * 发送派件通知
	* @Title: sendDispatchNotice 
	*  @param ygUser
	*  @param title
	*  @param logisticName
	*  @param expressCode
	*  @param link
	*  @param remark
	*  @return    入参
	* @return Message    返回类型
	* @author （guohao） 
	* @throws
	* @date 2018年4月26日 上午11:55:56 
	* @version V1.0
	 */
	Message sendOrderDispatchNotice(YgUser ygUser, String title, String logisticName, String expressCode, String link, String remark);

	/**
	 * 发送物流签收通知
	* @Title: sendDispatchNotice 
	*  @param ygUser
	*  @param title
	*  @param logisticName
	*  @param expressCode
	*  @param dispatcher
	*  @param mobile
	*  @param link 相对路径
	*  @param remark
	*  @return    入参
	* @return Message    返回类型
	* @author （guohao） 
	* @throws
	* @date 2018年4月26日 上午11:56:53 
	* @version V1.0
	 */
	Message sendOrderReceiptNotice(YgUser ygUser, String title, String orderCode, String recipienter, Date recipientTime, String link, String remark);

	/**
	 * 会员升级通知
	 * @param ygUser
	 * @param title
	 * @param memberLevel
	 * @param checkStatus
	 * @param remark
	 * @param link
	 * @return
	 */
	Message sendMemberUpgrade(YgUser ygUser, String title, String memberLevel, String checkStatus, String remark, String link);
	
	/**
	 * 待办任务提醒
	 * @param ygUser
	 * @param title
	 * @param content
	 * @param dateTime
	 * @param remark
	 * @param link
	 * @return
	 */
	Message sendTodoTasks(YgUser ygUser, String title, String content, Date dateTime, String remark, String link);
}
